home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 080 (1988-11-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 080 (1988-11-15)(Ossowski, Stefan)(DE)(PD).adf / CLI_Utilities / Split / Split.c < prev   
C/C++ Source or Header  |  1988-08-14  |  5KB  |  177 lines

  1.  
  2. /********************* Split *****************************************
  3.  
  4. File splitter - V1.0       Copyright 1987-1988 by Richard Lee Stockton
  5.                              permission granted for non-profit use and
  6.                              distribution. However, contributions sent
  7.                              to the author will be gladly and most
  8.                              gratefully spent. (address below)
  9.         
  10. USAGE: Split <path>filename <partsize>
  11.  
  12. EXAMPLE:
  13. cd ram:
  14. split df1:City.anim   - will break City.anim from df1: into 100k files
  15.                         named 1, 2, etc. on the RAM: disk.
  16. EXAMPLE:
  17. cd vd0:
  18. split War.data 150000 - will break War.data on VD0: into 150k files
  19.                         named 1, 2, etc. on VD0:.
  20.  
  21. Split was written to fill a need for a simple file splitter to
  22.    break down the size of those very large animation files into files
  23.    that your average BBS user can download within his time limit. Feel
  24.    free to use it for any other purpose you can imagine. It will work
  25.    on ANY type of file.
  26.  
  27. Destination files are written to the CURRENT directory. They are named
  28.    using numerals 1-9 then capital letters A-Z. If split is unable to
  29.    find the sourcefilename, it will quit.
  30.    
  31. Split does not test to see if there is enough room in the current
  32.    directory for all the partfiles. That part is up to you.
  33.  
  34. DEFAULT partsize = 100k bytes.
  35. MINimum partsize =   1k bytes.  (why would you want 'em this small?)
  36. MAXimum partsize = 1 Million bytes. (1000k)        (...or this big?)
  37.  
  38. If <partsize> falls out of range, the default partsize (100k) will be
  39.    used. Maximum number of parts = 35 (suffix = 1-9 then A-Z). 
  40.  
  41. RE-CONNECT EXAMPLE:
  42. join 1 2 3 4 5 6 7 8 9 A B C D E F as Action.anim
  43.  
  44. REMEMBER!:
  45.    The `join' command limits the number of parts to 15. (The 15th part
  46.    is F). If you have more than 15 parts, join them in sections and
  47.    then join the sections. (Put an `executeme' file in with the pieces,
  48.    so nobody gets confused! :-)
  49.                                             8/15/87  updated  3/8/88
  50.  
  51.                                              Comments/Contributions:
  52.                                               Richard Lee Stockton
  53.                                               21305 60th Ave. West
  54.                                               MtLkTerr, Wash 98043
  55.                                                (206)  776-1253
  56.  
  57. ********* Thanks to Andry Rachmat for the `skeleton'! :-) ***********/
  58.  
  59.  
  60. /*  Split.c  */
  61. /*               cc split.c  then  ln split.o -lc    with Manx 3.4  */
  62.  
  63. #include <exec/types.h>
  64. #include <libraries/dos.h>
  65.  
  66. #define MINSIZE 1000L
  67. #define NRMSIZE 100000L
  68. #define MAXSIZE 1000000L
  69.  
  70. #define USAGE "\n\
  71.   File splitter - V1.4  -  partsize from 1k-1meg, default=100k\n\
  72.    \xa9 1987-1988 RLStockton 21305 60th West, MtLkTerr, WA 98043\n\n\
  73.             USAGE: Split <path>filename <partsize>\n"
  74.  
  75. extern struct FileHandle *Open();
  76. extern char *AllocMem();
  77. extern long Seek(), Read(), Write(), Output(), atol();
  78. void   _abort(), _wb_parse();
  79.  
  80. Enable_Abort=1;     /*  Bail-Out is set to ON!  */
  81.  
  82.    struct FileHandle *infile=NULL, *outfile=NULL;
  83.    long iosize, actual;
  84.    char *buffer=NULL;
  85.    char partname[2];
  86.    int  partsuffix=1;
  87.  
  88. main(argc, argv)
  89.    int argc;
  90.    char *argv[];
  91. {
  92.  
  93. /* if no args, give (c), usage and exit */
  94.  
  95.    if(argc<2)
  96.    {
  97.        Write(Output(),USAGE,(long)strlen(USAGE));   _abort();
  98.    }
  99.    
  100. /* check and set iosize from argv[2] */
  101.  
  102.    if (argv[2]) actual = atol(argv[2]);
  103.    if (actual < MINSIZE) actual = NRMSIZE;
  104.    if (actual > MAXSIZE) actual = NRMSIZE;
  105.    iosize = actual;
  106.    
  107. /* allocate buffer */
  108.  
  109.    if ((buffer=AllocMem(iosize,0L))==NULL)          _abort();
  110.    
  111. /* open source file */
  112.  
  113.    if (!(infile=Open(argv[1],MODE_OLDFILE)))        _abort();
  114.    Seek(infile,0L,OFFSET_BEGINNING);
  115.  
  116. /*  !!! start of do loop !!!  */
  117.  
  118.    do
  119.    {
  120. /* construct new partname */
  121.  
  122.       partname[0] = (long)partsuffix + '0';  partname[1] = '\0';
  123.  
  124. /* inform user of file creation */
  125.  
  126.       Write(Output(),"creating ",10L);
  127.       Write(Output(),partname,2L);
  128.       Write(Output(),"\n",2L);
  129.       
  130. /* fill buffer, write partfile */
  131.  
  132.       if ((actual=Read(infile,buffer,iosize))==-1L) _abort();
  133.       if (!(outfile=Open(partname,MODE_NEWFILE)))   _abort();
  134.       if (Write(outfile,buffer,actual)!=actual)     _abort();
  135.       
  136. /* close the partfile and check for a CTRL 'c' */
  137.  
  138.       Close(outfile);  outfile=NULL;    Chk_Abort();
  139.  
  140. /* increment suffix index */
  141.  
  142.       partsuffix++;
  143.       if (partsuffix>42)
  144.       {
  145.          Write(Output(),"\nMore than 35 parts!\n",22L);
  146.          _abort();
  147.       }
  148.  
  149. /* skip over punctuation to caps */
  150.  
  151.       if(partsuffix==10) partsuffix = 17;
  152.  
  153.    }
  154.  
  155. /* loop as long as we have a full size file */
  156.  
  157.    while(actual==iosize);
  158.  
  159. /* clean up, quit, and go home. */
  160.  
  161.    _abort();
  162. }
  163.  
  164.  
  165. void _abort()    /* declare our own _abort() and save a few bytes */
  166. {
  167.    if ( outfile)  Close(outfile);
  168.    if ( infile )  Close(infile);
  169.    if ( buffer )  FreeMem(buffer,iosize);
  170.    _exit(0);
  171. }
  172.  
  173. void _wb_parse() {}    /* this stub saves a few bytes */
  174.  
  175.  
  176. /*****  end of split.c  *****/
  177.